package com.spring.aop.filteraop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @ClassName UsersAopFilter
 * @Description TODO:
 * @Author 12994
 * @Date 2024/10/19 13:16
 * @Version 1.0
 **/
// 代表这个类是一个切面
@Aspect
// Bean注解
@Component("usersAopFilter")
public class UsersAopFilter {
    // 使用切面规则声明一个AOP切入面 :   execution(返回值的类型 包名.类.方法(形参))
    @Pointcut("execution(* com.spring.aop.service.impl.*.*(..))")
    public void pointcut() {
    }

    @Before("pointcut()")
    public void before(JoinPoint jp) {
        System.out.printf("AOP 前置处理 ==> : 可以使用jp.getTarget获取调用该前置处理的对象: %s, 方法: %s, 参数: %s.\n", jp.getTarget(), jp.getSignature().getName(), Arrays.toString(jp.getArgs()));
    }

    @After("pointcut()")
    public void after(JoinPoint jp) {
        System.out.println("<== AOP 后置处理");
    }

    @AfterReturning(pointcut = "pointcut()", returning = "result")
    public void afterReturning(JoinPoint jp, Object result) {
        System.out.printf("<== AOP 后置返回: 可以使用Object result获取调用该后置处理的返回: %s.\n", result);
    }

    @AfterThrowing(pointcut = "pointcut()", throwing = "error")
    public void throwing(JoinPoint jp, Throwable error) {
        System.out.printf("<== AOP 异常处理: 可以使用Throwable error捕获该异常: %s.\n", error);
    }

    @Around("pointcut()")
    public Object around(ProceedingJoinPoint jp) throws Throwable {
        System.out.printf("<==AOP-环绕-前处理==> %S.\n", jp.getSignature().getName());
        Object result = jp.proceed();// 鉴权完毕，执行真实处理方法
        System.out.printf("<==AOP-环绕-后处理==> %S.\n", jp.getSignature().getName());
        return result;
    }
}
